home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / mint / utilit~1 / stlogin4.lzh / PASSWD.C < prev    next >
Encoding:
C/C++ Source or Header  |  1993-09-29  |  2.3 KB  |  109 lines

  1. /* UNIX like PASSWD program. Kees Lemmens; Aug '92
  2.  
  3.    With this program you can change the password entry in the /etc/passwd
  4.    file. Of course it is important to use the same encryption in this
  5.    routine as in the getty program or else you'll won't get in !
  6.  
  7.    Version 1.1 : Sept 1993
  8.  
  9.     Uid 0 doesn't have to enter old password anymore.
  10.  
  11.    Any questions or suggestions about this program can be send to:
  12.    lemmens@dv.twi.tudelft.nl
  13. */
  14.  
  15. #include <stdio.h>
  16. #include <stdlib.h>
  17. #include <time.h>
  18. #include <string.h>
  19. #include <pwd.h>
  20. #include "ux_misc.h"
  21.  
  22. char *tmp_file = TMPPW;
  23. char *pwd_file = PASSWD;
  24.  
  25. void pw_write(char *pwd,char *pwline,FILE *tmp)
  26. {    char *hlp=strchr(pwline,':')+1;
  27.  
  28.     encrypt(pwd);
  29.     fwrite(pwline,1,hlp-pwline,tmp);
  30.     fwrite(pwd,1,strlen(pwd),tmp);
  31.     fputs(strchr(hlp,':'),tmp);
  32. }
  33.  
  34. void cancel(FILE *tmp)
  35. {    endpwent();
  36.     fclose(tmp);
  37.     remove(tmp_file);
  38.     exit(1);
  39. }
  40.  
  41. void main(int argc, char *argv[])
  42. {    char *name,*hlp,pwd[50],pw2[50];
  43.     struct passwd *pwent;
  44.     FILE *tmp;
  45.     
  46.     if((tmp=fopen(tmp_file,"w+")) == NULL)        /* creat file */
  47.     {    tmp_file="c:\\etc\\passwd.nw";
  48.         pwd_file="c:\\etc\\passwd";
  49.         if((tmp=fopen(tmp_file,"w+")) == NULL)
  50.         {    puts("Can't open outputfile");
  51.             exit(1);
  52.         }
  53.     }
  54.  
  55.     name = argc>1 ? argv[1] : getenv("LOGNAME");        
  56.     if(name == NULL)
  57.     {    puts("No username supplied");
  58.         exit(1);
  59.     }
  60.     if((hlp=strchr(name,'\n')) != NULL) *hlp='\0';
  61.  
  62.     while(1)
  63.     {    if((pwent=getpwent()) == NULL)
  64.         {    puts("Loginname not found");
  65.             cancel(tmp);
  66.         }
  67.         if(! strncmp(name,pwd_line,strlen(name)) )
  68.             break;            /* login name found */
  69.         fputs(pwd_line,tmp);
  70.     }
  71.  
  72.     if(Pgetuid() != 0)    /* skip this part for root */
  73.     {    Put("\r\nOld password: ");
  74.         Get(pwd,40,0);
  75.  
  76.         if(check_pw(pwd,pwent) < 0)
  77.         {    puts("Invalid password");
  78.             cancel(tmp);
  79.         }
  80.     }
  81.  
  82.     Put("\r\nNew password: ");
  83.     Get(pwd,40,0);
  84.     Put("\r\nReenter new password: ");
  85.     Get(pw2,40,0);
  86.     
  87.     if(strcmp(pwd,pw2))
  88.     {     puts(" Both passwords do not match");
  89.         cancel(tmp);
  90.     }
  91.     pw_write(pwd,pwd_line,tmp);    /* write new entry */
  92.  
  93.     while(getpwent() != NULL)
  94.         fputs(pwd_line,tmp);        /* copy rest of passwdfile */
  95.  
  96.     fclose(tmp);
  97.     endpwent();
  98.     
  99.     Put("\r\n"); /* delay until file is really closed */
  100.  
  101.     if(remove(pwd_file) != 0)
  102.     {    puts("Can't write new passwd file !");
  103.         remove(tmp_file);
  104.     }
  105.     else
  106.         rename(tmp_file,pwd_file);
  107.     exit(0);
  108. }
  109.